/**
 * 
 */
package l1j.opqlo.假人系統;

import java.sql.Timestamp;

import javolution.util.FastTable;
import l1j.opqlo.NewSystem.A_ColorMessage;
import l1j.server.server.datatables.ItemTable;
import l1j.server.server.model.L1Inventory;
import l1j.server.server.model.Instance.L1DummyInstance;
import l1j.server.server.model.Instance.L1ItemInstance;
import l1j.server.server.model.Instance.L1PcInstance;
import l1j.server.server.model.item.L1ItemId;
import l1j.server.server.serverpackets.S_ServerMessage;

/**
 * @author 
 * @param D 表示假人的物件類型
 * @param E 表示假人的商品暫存器類型
 */
public class Shop<D extends L1DummyInstance>
{
	/** 安全性紀錄 */
	
//	private static final LogManager shop_log = LogManager.getLog("伺服器商城_紀錄");
//	private static final LogManager castle_log = LogManager.getLog("城堡獎勵商店_紀錄");
//	private static final LogManager free_log = LogManager.getLog("推文獎勵商店-紀錄");
//	private static final LogManager yanbo_log = LogManager.getLog("天寶商店_紀錄");
	
	/** 同步安全鎖 */
	private static final byte[] syn_data = new byte[0];
	/** 購買物品的玩家 */
	private final L1PcInstance pc;
	/** 販售物品的物件 */
	private final D dummy;
	/** 商店清單的暫存器*/
	private final FastTable<L1Dummy> shop;
	/** 項目清單的索引 */
	private final FastTable<Integer> indexList;
	/** 項目清單的項目數量 */
	private final FastTable<Long> amountList;
	/** 總和的價錢 */
	private int price;
	/** 加成的數量 */
	private long amount;
	
	/**
	 * 初始化自製或個人商店購買、販賣
	 * 
	 * @param pc 購買物品的玩家
	 * @param cha 販售物品的物件
	 */
	public Shop(L1PcInstance pc, D dummy) 
	{
		this.pc = pc;
		this.dummy = dummy;
		this.shop = A_DummyTable.get().getSellList().get(dummy.getNpcId());
		this.indexList = new FastTable<Integer>();
		this.amountList = new FastTable<Long>();
	}
	
	/**
	 * 加入要即將要被販售的物品
	 * 
	 * @param index 項目清單的索引
	 * @param amount 項目清單的項目數量
	 */
	public final void add(int index, long amount)
	{
		indexList.add(index);
		
		if (amount > 0xffffffffL)
		{
			amount = 0xffffffffL;
		}
		
		if (!(dummy.getNpcId() >= 97302 && dummy.getNpcId() <= 97313))
		{
			amount = amount > shop.get(index).getCount() ? shop.get(index).getCount() : amount;
		}
		else
		{
			L1Dummy ns = shop.get(index);
			
			// 伺服器是否有設定該商品可購買的數量
			if (ns.getMaxCount() > 0 && amount > ns.getMaxCount())
			{
				amount = ns.getMaxCount();
			}
		}
		
		amountList.add(amount);
	}
	
	/**
	 * 從L1Shop中取得所有即將被販售的物品，且計算總價格與安全性判斷後，再將該清單物品販售
	 * 
	 * @param itemId 貿易用的貨幣或道具
	 */
	public final void sell(int itemId)
	{
		synchronized (syn_data)
		{
			for (int i = 0; i < indexList.size(); i++)
			{
				int index = indexList.get(i);
				
				if (index >= shop.size())
				{
					// 找不到此商品時則直行至此
					return;
				}
				
				L1Dummy ns = shop.get(index);
				
				if (ns == null)
				{
					// 找不到此商品時則直行至此
					return;
				}
				
				price += ns.getMoney() * amountList.get(i);
				
				// 判斷是否NPC是否為個人商店
				if (!(dummy.getNpcId() >= 97302 && dummy.getNpcId() <= 97313))
				{
					amount = amountList.get(i);
				}
				// 不然則為商城或城堡商店
				else
				{
					amount = amountList.get(i) * ns.getCount();
				}
				
				// 判斷交易對象是否為時效性商店
				if (dummy.getNpcId() == 97303)
				{
					int itemid = ns.getItem().getItemId();
					
					// 判斷物品是否為時效性商品
					if (pc.getInventory().checkItem(itemid, 1))
					{
					//	if (!(ns.getId() >= 269 && ns.getId() <= 280))//NPC編號以寫死為時效性 z_npc_shop_sell資料表 ID欄位為269~280~將可重複購買
						{
							pc.sendPackets(new A_ColorMessage(15, ns.getItem().getName() + " 已經存在，無法重複購買！"));
							continue;
						}
					}
				}
				
				// 判斷背包是否可以攜帶此物品
				if (pc.getInventory().checkAddItem(ns.getItem(), amount) == L1Inventory.OK)
				{
					// 判斷指定的道具與數量是否足夠
					if (pc.getInventory().checkItem(itemId, price))
					{
						// 判斷指定的道具是否不可堆疊
						if (!ns.getItem().isStackable())
						{
							for (int j = 0; j < amount; j++)
							{
								makeItem(ns, itemId, 1);
							}
						}
						// 不可堆疊的道具重複插入
						else
						{
							makeItem(ns, itemId, amount);
						}
						
						// 扣除指定的道具
						pc.getInventory().consumeItem(itemId, price);
						
						// 假人個人商店判斷
						if (itemId == L1ItemId.ADENA)
						{
							ns.setCount(ns.getCount() - amountList.get(i));
							ns.getItem().setCount(ns.getItem().getCount() - amountList.get(i));
							
							if (ns.getCount() <= 0)
							{
								shop.remove(index);
							}
						}
					}else{
						pc.sendPackets(new S_ServerMessage(189));
						return;
					}
				}
				else
				{
					pc.sendPackets(new S_ServerMessage(270));
					return;
				}
			}
		}
	}
	
	private final void makeItem(L1Dummy dummy, int itemid, long count)
	{
		L1ItemInstance item = ItemTable.getInstance().createItem(dummy.getItem().getItemId());
		
		// 判斷時效性的道具
		if (dummy.getDayTime() > 0){
			item.setDeleteDate(new Timestamp(System.currentTimeMillis() + (dummy.getDayTime() * 86400000)));
		}
		
		item.setIdentified(true);
		item.setCount(count);
		item.setEnchantLevel(dummy.getSafeenchant());
		pc.getInventory().storeItem(item);
		
		/*
		if (itemid == 50015)
		{
			shop_log.write(pc.getNetConnection().getIp() + ":" + pc.getName() + " 購買了物品  "+"+" + item.getEnchantLevel() + item.getName()+"("+(amount)+")");
			pc.sendPackets(new S_SystemMessage("感謝你購買【" +(item.getName()+"("+ (amount) +")】此物品將紀錄於服務端資料中。")));
		}
		*/
		
		/*
		else if (itemid == 50016)
		{
			free_log.write(pc.getNetConnection().getIp() + ":" + pc.getName() + " 購買了物品  "+"+" + item.getEnchantLevel() + item.getName()+"("+(amount)+")");
			pc.sendPackets(new S_SystemMessage("感謝你購買【" +(item.getName()+"("+ (amount) +")】此物品將紀錄於服務端資料中。")));
		}
		*/
		
		/*
		else if (itemid >= 50017 && itemid <= 50021)
		{
			castle_log.write(pc.getNetConnection().getIp() + ":" + pc.getName() + " 購買了物品  "+"+" + item.getEnchantLevel() + item.getName()+"("+(amount)+")");
			pc.sendPackets(new S_SystemMessage("感謝你購買【" +(item.getName()+"("+ (amount) +")】此物品將紀錄於服務端資料中。")));
		}
		*/
		
		/*
		else if (itemid == 50022)
			{
			yanbo_log.write(pc.getNetConnection().getIp() + ":" + pc.getName() + " 購買了物品  "+"+" + item.getEnchantLevel() + item.getName()+"("+(amount)+")");
			pc.sendPackets(new S_SystemMessage("感謝你購買【" +(item.getName()+"("+ (amount) +")】此物品將紀錄於服務端資料中。")));
			}
		*/
	}
}
